home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1990-10-24 | 6.5 KB | 155 lines |
-
- DEFINITION MODULE LibFiles;
-
- (*$H+ erlaubt lokale Prozeduren bei 'LibQuery' *)
-
- (*
- * Verwaltet die Speicherung von vielen Dateien in einer großen Datei.
- *
- * Beispielsweise werden die Symbol-Dateien (.DEF) des Compilers in
- * solch einer großen Datei gespeichert, weil dies Speicherplatz
- * spart und der Zugriff darauf schneller ist als wenn die Dateien
- * alle einzeln vom GEMDOS in einem Unterverzeichnis verwaltet würden.
- *
- * Der Nachteil dieses Verfahrens: Das Einfügen neuer Dateien ist
- * aufwendiger. Deshalb sollte man nur solche Dateien in einer dieser
- * Library-Dateien zusammenfassen, die hauptsächlich gelesen werden
- * (so wie die mitgelieferten DEF-Dateien des Modula-Systems).
- *
- * Das Modul 'LibManager' zeigt eine beispielshafte Anwendung dieses Moduls.
- *)
-
- FROM Files IMPORT File;
- FROM Directory IMPORT FileAttrSet;
- FROM SYSTEM IMPORT ADDRESS, BYTE;
-
-
- TYPE LibFile = RECORD
- f: File;
- private: ADDRESS
- END;
-
- LibEntry = RECORD
- name: ARRAY [0..11] OF CHAR;
- attr: FileAttrSet;
- time: CARDINAL; (* gepacktes Format ! *)
- date: CARDINAL; (* gepacktes Format ! *)
- size: LONGCARD;
- start: LONGCARD
- END;
-
- UserData = ARRAY [0..39] OF BYTE;
-
- LibQueryProc = PROCEDURE ( (* entry: *) LibEntry ): BOOLEAN;
-
-
- PROCEDURE OpenLib ( VAR handle: LibFile; REF libraryName: ARRAY OF CHAR;
- VAR reply: INTEGER );
- (*
- * Öffnet eine vorhandene Library-Datei mit dem Namen 'libraryName'
- * und liefert in 'handle' eine Zugriffskennung darauf.
- *
- * 'reply' liefert ggf. einen Fehlercode (negativ). Ist die Datei
- * keine Library-Datei, wird in 'reply' "fBadOp" geliefert.
- *
- * Am Ende sollte die Libary mit 'CloseLib' wieder geschlossen werden.
- *)
-
- PROCEDURE LookUp ( VAR handle: LibFile; REF fileName: ARRAY OF CHAR;
- VAR info: LibEntry; VAR reply: INTEGER );
- (*
- * Sucht die Datei namens 'fileName' innerhalb der Libary mit der
- * Zugriffskennung 'handle'. 'reply' liefert ggf. einen Fehlercode (negativ).
- *
- * Die gesuchte Datei muß dann mit den Funktionen aus dem Binary-Modul
- * gelesen werden. Dazu findet sich in 'info.start' die Anfangsposition
- * in der Library-Datei, in 'info.size' deren Länge. Mittels 'handle.f'
- * wird auf die Libary-Datei zugegriffen.
- * Siehe dazu das Modul 'LibManager' im UTILITY-Ordner.
- *)
-
- PROCEDURE LibQuery ( VAR handle: LibFile; proc: LibQueryProc;
- VAR reply: INTEGER );
- (*
- * Geht alle Dateien in der Library durch und ruft jedesmal 'proc' auf.
- *)
-
- PROCEDURE CloseLib ( VAR handle: LibFile );
- (*
- * Schließt eine mit 'OpenLib' geöffnete Libary.
- *)
-
- PROCEDURE CreateLib ( REF libraryName: ARRAY OF CHAR; VAR reply: INTEGER );
- (*
- * Erzeugt eine neue, leere Library-Datei.
- * 'reply' liefert ggf. einen Fehlercode (negativ).
- *)
-
- PROCEDURE SetUserData ( REF libraryName: ARRAY OF CHAR;
- REF data: ARRAY OF BYTE; VAR reply: INTEGER );
- (*
- * Jede Library-Datei hat ein Feld reserviert, in dem das Anwenderprogramm
- * beliebige Daten ablegen kann. Das Feld ist intern als 'UserData' (s.o.)
- * definiert, faßt also maximal 'SIZE(UserData)' Bytes. Das Anwenderprogramm
- * kann mit dieser Prozedur das Feld der Libary-Datei 'libraryName' mit
- * den Daten 'data' beschreiben. Dabei darf das übergebene Datum die Größe
- * von 'UserData' unter- aber nicht überschreiten, andernfalls wird der
- * Laufzeitfehler 'MOSGlobals.StringOverflow' gemeldet.
- * 'reply' liefert einen neg. Wert, wenn die Library-Datei nicht ansprechbar
- * ist.
- * Die Library-Datei muß bei Aufruf dieser Prozedur geschlossen sein!
- *)
-
- PROCEDURE GetUserData ( REF libraryName: ARRAY OF CHAR;
- VAR data: ARRAY OF BYTE; VAR reply: INTEGER );
- (*
- * Hiermit können die von 'SetUserData' eingetragenen Daten wieder
- * ermittelt werden. Die für 'user' übergebene Variable muß ausreichend
- * groß für die Daten sein - es werden nur so viele Bytes ausgelesen,
- * wie die Variable fassen kann (einen Laufzeitfehler gibt's nicht).
- * 'reply' liefert einen neg. Wert, wenn die Library-Datei nicht ansprechbar
- * ist.
- * Die Library-Datei muß bei Aufruf dieser Prozedur geschlossen sein!
- *)
-
- PROCEDURE RemoveFile ( REF libraryName, fileName: ARRAY OF CHAR;
- VAR damaged: BOOLEAN; VAR reply: INTEGER );
- (*
- * Enfernt die Datei 'fileName' aus dem Verzeichnis der Library namens
- * 'libraryName'. Dabei kann die Länge der Library-Datei leider nicht
- * verringert werden - der belegte Platz in der Library bleibt unbenutzt.
- * Mit der Funktion 'CopyLib' kann die Library-Datei aber aufgeräumt werden.
- * Liefert 'damaged' TRUE, ist die Lib-Datei defekt und kann nicht mehr
- * benutzt werden. Deshalb sollte sie dann gelöscht werden.
- * Die Library-Datei muß bei Aufruf dieser Prozedur geschlossen sein!
- *)
-
- PROCEDURE CopyLib ( REF sourceLib, destLib: ARRAY OF CHAR; VAR reply: INTEGER );
- (*
- * Kopiert die Libary in eine neue Datei. Dabei wird die Zieldatei
- * auf die kleinstmögliche Länge verkürzt. Diese Funktion bietet sich
- * an, wenn 'RemoveFile' verwendet wurde, um den unbenutzten Platz in
- * der Lib-Datei zu eliminieren.
- * 'destLib' darf vorher nicht existieren, sonst wird die neue Datei nicht
- * erzeugt.
- * Die Library-Datei muß bei Aufruf dieser Prozedur geschlossen sein!
- *)
-
- PROCEDURE AddFile ( REF libraryName: ARRAY OF CHAR; VAR entry: LibEntry;
- VAR damaged: BOOLEAN; VAR reply: INTEGER );
- (*
- * Fügt die in 'entry' beschriebene Datei ins Verzeichnis der Library
- * namens 'libraryName' ein. Die einzufügende Datei darf noch nicht
- * existieren.
- * In 'entry' müssen beim Aufruf alle Daten bis auf 'entry.start' initiali-
- * siert sein. Nach dem Aufruf erhält man in 'entry.start' die Dateiposi-
- * tion, an die die Daten der Datei geschrieben werden müssen (z.B. mit den
- * Funktionen aus 'Binary'). Es ist darauf zu achten, daß nicht mehr
- * Bytes geschrieben werden, als in 'entry.size' angegeben wurde!
- * Liefert 'damaged' TRUE, ist die Lib-Datei defekt und kann nicht mehr
- * benutzt werden. Deshalb sollte sie dann gelöscht werden.
- * Die Library-Datei muß bei Aufruf dieser Prozedur geschlossen sein!
- *)
-
- END LibFiles.
-